package com.weiliang.www;

import java.util.Scanner;

/**
 * @Author: liangWeiQUQ
 * @Description: 汉明距离
 * @DateTime: 2021/5/27 17:27
 * 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
 *
 * 给出两个整数 x 和 y，计算它们之间的汉明距离
 **/
public class HammingDistance461 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要汉明距离的第一个数字");
        int x = scanner.nextInt();
        System.out.println("请输入你要汉明距离的第二个数字");
        int y = scanner.nextInt();
        int s =hammingDistance(x,y);
        System.out.println("两个数的汉明距离为：" + s);
    }

    private static int hammingDistance(int x, int y) {
    //汉明距离：两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目
        //异或（^）：两个整数二进制每一位相同的变为0，不同的为1。
        // 任何数与0异或结果仍然为该数本身（0每一位都是0，与0异或为0，与1异或为1，所以对任意数没有影响）
        // 例：123 ^ 0 = 123；0 ^ 1 = 1; 1 ^ 0 = 1; 0 ^ 0 = 0; 1 ^ 1= 0。
        // 两个整数进行异或，会保留不同的每一位，如100100111 ^ 001100101 = 101000010，所得数中1的个数即为汉明距离。
        //return Integer.bitCount(x ^ y);直接使用异或的api
        int count=0;
        if(x==y){
            return 0;}
        while(x!=0||y!=0){
            if(x%2!=y%2){
                count++;}
            x=x/2;
            y=y/2;
        }
        return count;

    }

}
